home *** CD-ROM | disk | FTP | other *** search
/ MIDICraft's MIDINET CD-ROM / MIDICraft's MIDINET CD-ROM.iso / DOSUTILS / KORG / SB.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-01  |  2.6 KB  |  183 lines

  1. #include "sb.hpp"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5.  
  6. #define MIDI_READ_POLL        0x30
  7. #define MIDI_WRITE_POLL     0x38
  8.  
  9. int baseport = 0x220;
  10.  
  11. int sb_environ(int &portno, int& irqno, int &dma)
  12. {
  13. char* env, *p;
  14.  
  15.   if (!(env = getenv("BLASTER")))
  16.     return 0;
  17.   p = strchr(env, 'A');
  18.   if (p)
  19.     sscanf(p+1, "%x", &portno);
  20.   p = strchr(env, 'I');
  21.   if (p)
  22.     sscanf(p+1, "%x", &irqno);
  23.   p = strchr(env, 'D');
  24.   if (p)
  25.     sscanf(p+1, "%x", &dma);
  26.   return 1;
  27. }
  28.  
  29. Soundblaster::Soundblaster()
  30. {
  31. }
  32.  
  33. Soundblaster::~Soundblaster()
  34. {}
  35.  
  36.  
  37. Soundcard* Soundblaster::recognize()
  38. {
  39. int irqno = 5, dma = 0;
  40.  
  41.   if (sb_environ(baseport, irqno, dma))
  42.   {
  43.     if (!resetsb())
  44.       return 0;
  45.  
  46.     Soundblaster* sb = new Soundblaster;
  47.     if (sb)
  48.       return sb;
  49.   }
  50.   return 0; // not recognized
  51. }
  52.  
  53. int Soundblaster::reset()
  54. {
  55.   return resetsb();
  56. }
  57.  
  58. int Soundblaster::resetsb()
  59. {
  60. int port = baseport + 6;
  61.  
  62.   asm mov dx, port
  63.   asm mov al, 1
  64.   asm out dx,al
  65.   asm sub al,al
  66. wait:
  67.   asm dec al
  68.   asm jnz wait
  69.   asm out dx, al
  70.  
  71.   int acknowledge = Soundblaster::getsb();
  72.   // this byte should be AA if soundcard is installed
  73.   return acknowledge == 0xAA;
  74. }
  75.  
  76. void Soundblaster::startinput()
  77. {
  78.   putbyte(MIDI_READ_POLL);
  79. }
  80.  
  81. void Soundblaster::stopinput()
  82. {
  83.   reset();
  84. }
  85.  
  86. int Soundblaster::getbyte()
  87. {
  88.   return getsb();
  89. }
  90.  
  91. int Soundblaster::getsb()
  92. {
  93. int port = baseport;
  94. int ret;
  95.  
  96.   asm push dx
  97.   asm push cx
  98.   asm mov dx, port
  99.   asm add dl,0eh
  100.   asm mov al, 0f0h
  101.   asm mov cx,200h
  102. retry:
  103.   asm in al, dx
  104.   asm or al,al
  105.   asm js ready
  106.   asm loop retry
  107.   ret = -1;
  108.   goto end;
  109. ready:
  110.   asm sub dl,4
  111.   asm in al,dx
  112.   ret = _AL;
  113. end:
  114.   asm pop cx
  115.   asm pop dx
  116.   return ret;
  117. }
  118.  
  119. int Soundblaster::putbyte(unsigned char c)
  120. {
  121. int port = baseport;
  122. int ret;
  123.  
  124.   asm push cx
  125.   asm push ax
  126.   asm push dx
  127.   asm mov dx, port
  128.   asm add dx, 0ch
  129.   asm mov al, c
  130.   asm mov ah, al
  131.   asm mov al, 0f0h
  132.   asm mov cx,1000h
  133. retry:
  134.   asm dec cx
  135.   asm jz timeout
  136.   asm in al, dx
  137.   asm or al,al
  138.   asm js retry
  139.   asm mov al, ah
  140.   asm out dx,al
  141.   ret = 1;
  142.   goto end;
  143.  
  144. timeout:
  145.   ret = 0;
  146. end:
  147.   asm pop dx
  148.   asm pop ax
  149.   asm pop cx
  150.   return ret;
  151. }
  152.  
  153. int Soundblaster::hear(unsigned char* buf, int maxlen)
  154. {
  155. int n = 0;
  156. int c;
  157.  
  158.   while ( n < maxlen)
  159.   {
  160.     c = getbyte();
  161.     if (c == -1)
  162.       break;
  163.     *buf++ = c;
  164.     n++;
  165.   }
  166.   return n;
  167. }
  168.  
  169. int Soundblaster::play(unsigned char* buf, int len)
  170. {
  171. int n = 0;
  172.  
  173.   while (len-- > 0)
  174.   {
  175.     if (!putbyte(MIDI_WRITE_POLL))
  176.       break;
  177.     if (!putbyte(*buf++))
  178.       break;
  179.     n++;
  180.   }
  181.   return n;
  182. }
  183.